package com.woniu.order.util;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private RedisTemplate<String ,Object> redisObjectTemplate;

    /**
     * 向redis中存储一个字符串数据无过期时间
     */
    public void set(String key,String value){
        stringRedisTemplate.opsForValue().set(key,value);
    }

    /**
     * 向redis中存储一个字符串数据有过期时间
     */
    public void set(String key,String value,long expire){
        stringRedisTemplate.opsForValue().set(key, value,expire, TimeUnit.SECONDS);
    }
    /**
     * 向redis中取出一个键值对
     */
    public String get(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }
    //判断redis中是否存在该键
    public boolean exist(String key){
        return stringRedisTemplate.hasKey(key);
    }
    //判断redis中是否存在该键
    public void incr(String key){
        stringRedisTemplate.opsForValue().increment(key);
    }
    //通过键值对删除
    public void del(String key){
        stringRedisTemplate.delete(key);
    }

    //获取一个数据在zSet中的排序值
    public Double zscore(String key,String value){
        return stringRedisTemplate.opsForZSet().score(key,value);
    }

    //存入一个数据在zSet中的排序值
    public void zAdd(String key,String value,double score){
        stringRedisTemplate.opsForZSet().add(key,value,score);
    }

    //使zset中的某个数据的排序值自增
    public void zincrby(String key,String value,double score){
        stringRedisTemplate.opsForZSet().incrementScore(key,value,score);
    }
    //获取分页后集合
    public Set<String> zrevrange(String key,Integer start,Integer end){
        return stringRedisTemplate.opsForZSet().reverseRange(key,start,end);
    }
    //返回Zset的数据长度
    public long zcard(String key){
        return stringRedisTemplate.opsForZSet().zCard(key);
    }
    //删除zset中的一个数据
    public void zrem(String key,String value){
        stringRedisTemplate.opsForZSet().remove(key,value);
    }
    //使HASH中的一个数据自增
    public void hincrby(String key,String hashKey,Integer number){
        stringRedisTemplate.opsForHash().increment(key,hashKey,number);
    }
    //新增一组hash数据
    public void hmset(String key, Map<String,Object> map){
        stringRedisTemplate.opsForHash().putAll(key,map);
    }

    //查询hash中的数据
    public Map<Object, Object> hgetall(String key){
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(key);
        return entries;
    }

//    //修改hash中的键值
//    public Map<Object, Object> hmset(String key){
//        Map<Object, Object> entries = stringRedisTemplate.opsForHash().putIfAbsent();
//        return entries;
//    }

    //新增一个对象数据以字符串的形式保存到redis无过期时间
    public void setObject(String key,Object value){
        redisObjectTemplate.opsForValue().set(key,value);
    }

    //新增一个对象数据以字符串的形式保存到redis有过期时间
    public void setObject(String key,Object value,long minute){
        redisObjectTemplate.opsForValue().set(key,value,minute,TimeUnit.MINUTES);
    }

    //取出HASH中的一个数据
    public  Object hget(String key,String haskey){
        return stringRedisTemplate.opsForHash().get(key,haskey);
    }
    //获取一个对象数据
    public Object getObject(String key){
        return redisObjectTemplate.opsForValue().get(key);
    }

}
